//
//  Base.swift
//  CommandLineTool1
//
//  Created by May on 2025/3/26.
//

import Foundation

class Bit {
    
    func note() {
        // N * 2 == N << 1
        // N * 2 + 1 == ((N << 1) | 1)
        
        // 异或可以记为无进位相加
        // 0 ^ N == N
        // N ^ N == 0
        // 同样的几个数，不管以什么顺序异或的结果相同
        // 交换两个数：
        // a = a^b // a == a^b, b == b
        // b = a^b // 分别带入ab: b == a ^ b ^ b = a, a = a ^ b
        // a = a^b // 分别带入ab: a == a ^ b ^ b = a, b = a
        
        // 题目：一个数组中只有一种数出现了奇数次，其他的都出现了偶数次，怎么找出这个数
        // var eor = 0 , 用 eor 分别异或素组的每一个元素，异或结果跟顺序无关，偶数次的就被消掉了，只剩下奇数次的元素
        
        // 题目： 怎么把一个Int类型的数提取出最右侧的1来(0011000, 不一定是最后一位)
        // N & ((~N) + 1) // 0011000 & (1100111 + 1)
        
        // 题目： 一个数组中有两种数出现了奇数次，其他的出现了偶数次，找到这两种数
        // var eor 遍历异或数组每个元素，结果eor = a^b， a!=b => eor != 0, 所以eor一定在某个位(i)上有1
        // 说明 a 和 b 在这一位(i)不一致
        // 按照i位为0或者1把数组分成两部分，a,b一定分别位于两部分
        // 再用eor_1 分别异或其中一部分，结果就一定是a,b中的一个
        // eor ^ eor_1 就是另一个
        
        // 题目：数一个二进制上有多少个1
        // 找出最右侧的1 ，抹掉这个1，repeat
    }
    
    static func printBit(i: Int) {
        var tmp = i
        for _ in 0..<Int.bitWidth {
            print((tmp & 0x1) == 0 ? 0 : 1, separator: "", terminator: "")
            tmp = tmp >> 1
        }
        print(" ")
    }
    
    static func printBitReversed(i: Int) {
        var tmp = i
        for _ in 0..<Int.bitWidth {
            print(tmp & (1 << 63) == 0 ? 0 : 1, separator: "", terminator: "")
            tmp = tmp << 1
        }
        print(" ")
    }
}
